王爽老师的书差不多看了一半,听很多人说这位老师的书写的很不错,为了看完之后不至于很容易的忘记,故结合前人笔记草草回顾一遍…
第一章 基础知识
1.存储单元为1Byte,即字节。微小信息单位为1bit,其中1Byte=8bit。
(一个存储单元可以存储8个bit,即8位二进制数。)
1GB=1024MB 1MB=1024KB 1KB=1024B 1B=8bit
2.存储单元从零开始顺序编号。
第二章 寄存器
3.8086CPU有14个寄存器,AX(accumulate) BX(base) CX(count) DX(data) SI DI
指针寄存器:SP BP IP
段寄存器:CS SS DS ES
标志寄存器:PSW
4.AX可分为AH(高8位)和AL(低8位),均可以当做独立寄存器使用,互不影响。
5.对于实验中溢出的数据,由PSW寄存器保存溢出值。
6.8086CPU采用段地址和偏移地址,通过地址加法器来合成物理地址
物理地址=段地址x 16 + 偏移地址(段的大小=偏移地址的长度)
7.偏移地址16位,其变化范围为0—FFFFH;仅用偏移地址来寻址最多可寻64KB个内存单元。
第三章 寄存器(内存访问)
8.字单元:存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元,将起始地址为N的字单元简称为N地址字单元。
9.8086CPU不支持数据直接入段寄存器
10.栈:LIFO(后进先出) 8086CPU入栈(PUSH)和出栈(POP)以字为单位;
11.SS:SP 任意时刻始终指向栈顶元素,PUSH AX由下面两步构成:
(1)SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元作为新的栈顶;
(2)将AX中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶.
(栈顶指针指向的元素最终都是有效的)
12.8086CPU入栈时,栈顶从高地址向低地址方向移动,栈为空的时候,SS:SP指向最底部的字单元的偏移地址+2。
13.出栈后,SS:SP指向新的栈顶,但之间栈顶的元素还在,只是不在栈中,在之后PUSH移动至此后,此数据将会被覆盖。
第4章 第一个程序
14.一个汇编程序由多个段组成,这些段分别用来存放代码,数据,后者当做栈空间,一个有意义的汇编程序中至少有一个段,这个段用来存放代码。
第5章 【bx】和loop指令
15.① 【 】表示偏移地址,也表示一个内存单元
②( )表示“一个寄存器或一个内存单元中的内容”
③ Idata表示常量
16.Loop指令的格式:
loop 标号
①(CX)=(CX)- 1;
②(CX)≠0,则转至标号处循环执行(CX)=0,则继续向下执行
第7章 更灵活的定位内存地址的方法
17.在汇编程序中,数据不能以字母开头(+0)
18.伪指令:
dw 定义字型数据;
db 定义字节型数据;
dd 定义双字型数据
19.Si和Di不能够分成两个8位寄存器,功能和BX相近。
20.大小写的转化方法:
and al,11011111 b(大写)
or al,00100000 b (小写)
第8章 数据处理的两个基本问题
21.Reg(寄存器):AX,BX,CX,DX(及其8位高低寄存器),SP,BP,Si, Di
Sreg(段寄存器):DS,SS,CS,ES
8086CPU只有BX,Si,Di, BP可以用【】来进行内存单元寻址,可以单独出现,或BXBX BPBP SiDi SiDi 组合出现
22.在【】中使用BP,如果指令没有显性给出段地址,默认在SS中
23.指令在执行前,所要处理的数据可以在3个地方:CPU内部,内存,端口
24.div指令(除法指令)
8位除数 16位除数
16位被除数 32位被除数{ AX (低16位)DX(高16位)}
AL(商)AH(余数) AX(商)DX(余数)
25.伪指令dup
db/dw/dd 重复次数 dup(重复的字节/字型/双字型)
dw 0, 0, 0, 0, 0, 0 ,0, 0 = dw 8 dup(0)
第9章 转移指令的原理
26.转移指令:可以修改IP,或同时修改CS和IP的指令。
8086CPU的转移行为:
段间转移(修改CS:IP)
段内转移(只修改IP)短转移:IP修改范围-128—127
近转移:IP修改范围 -32768—32767
27.offset 取得标号处的偏移地址
nop 空指令(占位置/用于程序对齐/设标号/延时)
28.jmp指令
依据位移转移的jmp指令(CPU在执行jmp指令的时候不要需要转移的目的地址)
jmp short 标号 段内短转移 功能:IP=IP+8位位移(标号处地址-jmp指令后第一个字节地址)
jmp near ptr 标号 段内近转移 功能:IP=IP+16位位移
转移的目的地址在指令中的jmp指令
jmp far ptr 标号 段间转移 功能:CS=标号所在段的段地址,IP=标号在段中的偏移地址
转移地址在寄存器中的jmp指令
jmp 16位reg 功能:IP=(16位reg)
转移地址在内存中的jmp指令
Jmp word ptr 内存单元地址(段内转移)功能:转移的偏移地址是内存单元中的内容
Jmp dword ptr 内存单元地址(段间转移)功能:内存单元中的高地址处为转移的段 地址,低地址处是转移的目的偏移地址
29.jcxz指令
jcxz 标号 功能:相当于if((cx)==0)jmp short 标号
30.loop指令
loop 标号 功能:相当于(cx)– ; if((cx)!=0)jmp short 标号
第10章 CAll和RET指令
31.call指令(和jmp指令进行比较)
依据位移转移的call指令(CPU在执行call指令的时候不要需要转移的目的地址)
call 标号 相当于push IP /jmp near ptr 标号;
转移的目的地址在指令中的call指令
call far ptr 标号 相当于push CS / push IP / jmp far ptr 标号
转移目的地址在寄存器中的call指令
call 16位reg 相当于push IP / jmp 16位reg;
转移地址在内存中的call指令
call word ptr 内存单元地址 相当于push IP / jmp word ptr 内存单元地址;
call dword ptr 内存单元地址 相当于push CS / push IP /jmp dword ptr 标号
32.ret和retf指令
ret指令用栈中的数据,修改IP的内容,从而实现近转移,相当于pop IP;
retf指令用栈中的数据,修改CS和IP中的内容,从而实现远转移;相当于pop IP/pop CS
33.mul指令
格式:mul reg 或者mul 内存单元;
结果:8位乘法,结果放在AX中,16位乘法,则高位放在DX中,低位放在AX中
第11章 标志寄存器
34.8086CPU的flag寄存器的结构
35.adc指令(带进位的加法指令)
格式:adc 操作对象1 操作对象2
功能:操作对象1=操作对象1 + 操作对象2 + CF
36.sbb指令(带借位的减法指令)
格式:sbb 操作对象1 操作对象2
功能:操作对象1=操作对象1 - 操作对象2 - CF
37.cmp指令 (比较指令,不保存结果,影响相关标志位的值)
格式:cmp 操作对象1 操作对象2
功能: 操作对象1 - 操作对象2
38.检验比较结果的条件转移指令 (e:equal ;a:above ;b:below;)
39.rep movsb相当于:
s:movsb
loop s
rep的作用是根据CX的值,重复执行后面的穿传送指令。由于每执行一次movsb指令si和di都会递增或递减指向后一个单元或前一个单元,则rep movsb就可以循环实现(CX)个字符的传送。
执行movsb相当于进行以下几步操作:
- ((es)16+(di))=((ds)16+(si))
- 如果df=0 则si=si+1 di=di+1
如果df=1 则si=si-1 di=di-1
40.cld 将标志寄存器的DF置0,正向
std 将标志寄存器的DF置1,逆向
pushf 将标志寄存器入栈
popf 将标志寄存器出栈
第12章 内中断
41.内中断就是CPU不再处理执行中的指令,而是转去处理这个特殊的信息
内中断的产生包括以下几个:
除法错误(div指令产生的除法溢出) 中断类型码:0
单步执行 中断类型码:1
执行into指令 中断类型码:4
执行int指令 中断类型码:n (int n)
42.关于中断过程
CPU收到中断信息—生成中断类型码—查找中断向量表—找到中断处理程序入口(设置段地址和偏移地址)
对于8086CPU,中断向量表存在于内存0000:0000—0000:03FF的1024个单元中,由于其中有一些空白的地方,所以我们一般将自己编写的中断程序放在0000:0020—0000:02FF的256个字节空间里。
PC机的中断例程是由CPU硬件完成,在接受到中断信息后,会执行一下操作:
① 产生中断类型码
② 标志寄存器的值入栈(pushf)
③ 设置标志寄存器中的IF和TF的值为0(原因在书P250和P273)
④ CS内容入栈 (push CS)
⑤ IP内容入栈 (push IP)
⑥ IP=中断类型码4 (N4)
⑦ CS=中断类型码4+2 (N4+2)
43.编写中断处理程序的步骤
① 保存用到的寄存器
② 处理中断
③ 恢复用到的寄存器
④ 用iret指令返回
44.Iret指令的功能用汇编语言描述为:
POP IP
POP CS
popf第13章 int指令
45.int指令引发的中断(int n)
过程:
1.取得中断类型码n
2.标志寄存器入栈,IF,TF设置为0
3.CS,IP入栈
4.(IP)=(n 4),(CS)=(n 4 + 2)
46.BIOS中主要包含的内容
硬件系统的检测和初始化程序
外部中断和内部中断的中断例程
用于对硬件设备进行的I/O操作的中断例程
其他和硬件系统相关的中断例程
第14章 端口
47.shl(左移)和shr(右移)指令
将一个寄存器或内存单元中的数据向左(向右)移位
将最后移出的一位写入CF中
最低位(最高位)用0补充
第15章 外中断
48.外中断:对外部设备进行控制
外放的输入—相关接口芯片的端口—CPU内存
……………………………………………………..
指令系统总结
8086CPU 提供以下几大类指令:
1、数据传送指令
比如:mov、push、pop、pushf、popf、xchg等都是数据传送指令,这些指令实现寄存器和内存、寄存器和寄存器之间的单个数据传送。
2、算术运算指令
比如:add、sub、adc、sbb、inc、dec、cmp、imul、idiv、aaa等都是算术运算指令,这些指令实现寄存器和内存中的数据的算数运算。
它们的执行结果影响标志寄存器的:sf、zf、of、cf、pf、af位。
3、逻辑指令
比如:and、or、not、xor、test、shl、shr、sal、sar、rol、ror、rcl、rcr 等都是逻辑指令。
除了not指令外,它们的执行结果都影响标志寄存器的相关标志位。
4、转移指令
可以修改IP ,或同时修改CS 和IP 的指令统称为转移指令。转移指令分为以下几类:
(1)无条件转移指令,比如:jmp;
(2)条件转移指令,比如:jcxz、je、jb、ja、jnb、jna等;
(3)循环指令,比如:loop;
(4)过程,比如:call、ret、retf;
(5)中断,比如int、iret。
5、处理机控制指令
这些指令对标志寄存器或其他处理机状态进行设置,比如:cld、std、cli、sti、nop、clc、cmc、stc、hlt、wait、esc、lock等都是处理机控制指令。
6、串处理指令
这些指令对内存中的批量数据进行处理
比如:movsb、movsw、cmps、scas、lods、stos等。
若要使用这些指令方便地进行批量数据的处理,则需要和rep、repe、repne等前缀指令配合使用。